package com.ld.common.config.swagger;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;

import com.ld.shieldsb.common.core.util.BeetlUtil;

import lombok.extern.slf4j.Slf4j;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Swagger2 的配置 ，注意不要开启@EnableSwagger2Doc这个注解 否则配置失败
 * 
 * @ClassName Swagger2
 * @author <a href="mailto:donggongai@126.com" target="_blank">吕凯</a>
 * @date 2018年12月24日 下午3:06:15
 *
 */
@Configuration
@EnableSwagger2
@Slf4j
public class Swagger2 {

    /**
     * 
     * 默认接口信息（前台）<br/>
     * 通过frontApi函数创建Docket的Bean之后，fronatApiInfo()用来创建该Api的基本信息（这些基本信息会展现在文档页面中）。
     * select()函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger来展现，本例采用指定扫描的包路径来定义， Swagger
     * 会扫描该包下所有Controller定义的API，并产生文档内容（除了被@ApiIgnore指定的请求）。
     * 
     * @Title frontApi
     * @author 吕凯
     * @date 2018年12月24日 下午3:07:14
     * @return Docket
     */
    @Bean
    public Docket frontApi() {
        log.debug("swagger2前台api");
        List<ResponseMessage> msglist = new ArrayList<>();
        msglist.add(new ResponseMessageBuilder().code(200).message("请求成功!").build());
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(fronatApiInfo()).select()
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 这里采用包含注解的方式来确定要显示的接口
                .apis(RequestHandlerSelectors.basePackage("com.ld.front")) // 这里采用包扫描的方式来确定要显示的接口
                .paths(PathSelectors.any()).build().globalResponseMessage(RequestMethod.GET, msglist)
                .globalResponseMessage(RequestMethod.POST, msglist); // 增加全局消息定义;
    }

    /**
     * api信息
     * 
     * @Title fronatApiInfo
     * @author 吕凯
     * @date 2018年12月24日 下午3:05:30
     * @return ApiInfo
     */
    private ApiInfo fronatApiInfo() {
        Map<String, Object> model = new HashMap<>();
        String description = BeetlUtil.render("api-description.html", model); // 模板中获取

        return new ApiInfoBuilder().title("信用信息接口 ").description(description)
                .contact(new Contact("KevinLv", "http://www.11315.com", "291490365@qq.com")).version("1.0").build();
    }

    // 后台
    @Bean
    public Docket adminApi() {
        log.debug("swagger2后台api");
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(adminApiInfo()).select()
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 这里采用包含注解的方式来确定要显示的接口
                .apis(RequestHandlerSelectors.basePackage("com.ld.admin")) // 这里采用包扫描的方式来确定要显示的接口
                .paths(PathSelectors.any()).build().groupName("后台接口文档V1.0"); // groupName分组名称
    }

    private ApiInfo adminApiInfo() {
        String description = "后台接口信息";

        return new ApiInfoBuilder().title("信用信息接口 ").description(description)
                .contact(new Contact("KevinLv", "http://www.11315.com", "291490365@qq.com")).version("1.0").build();
    }

    // 公共
    @Bean
    public Docket commonApi() {
        log.debug("swagger2公共api");
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(commonApiInfo()).select()
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 这里采用包含注解的方式来确定要显示的接口
                .apis(RequestHandlerSelectors.basePackage("com.ld.common")) // 这里采用包扫描的方式来确定要显示的接口
                .paths(PathSelectors.any()).build().groupName("公共接口文档V1.0"); // groupName分组名称
    }

    private ApiInfo commonApiInfo() {
        String description = "公共接口信息";

        return new ApiInfoBuilder().title("信用信息接口 ").description(description)
                .contact(new Contact("KevinLv", "http://www.11315.com", "291490365@qq.com")).version("1.0").build();
    }

    // 论坛
    @Bean
    public Docket bbsApi() {
        log.debug("swagger2论坛api");
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(bbsApiInfo()).select()
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 这里采用包含注解的方式来确定要显示的接口
                .apis(RequestHandlerSelectors.basePackage("com.ld.bbs")) // 这里采用包扫描的方式来确定要显示的接口
                .paths(PathSelectors.any()).build().groupName("论坛接口文档V1.0"); // groupName分组名称
    }

    private ApiInfo bbsApiInfo() {
        String description = "论坛接口信息";

        return new ApiInfoBuilder().title("信用信息接口 ").description(description)
                .contact(new Contact("KevinLv", "http://www.11315.com", "291490365@qq.com")).version("1.0").build();
    }
}
